#region Using References

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

#endregion

namespace Beaker.OpenCube.Metadata
{
	public class NamedMetadataDictionaryConverter<TMetadata>
		: JsonConverter
		where TMetadata : INamedMetadata
	{
		/// <summary>
		/// Determines whether this instance can convert the specified object type.
		/// </summary>
		/// <param name="objectType">Type of the object.</param>
		/// <returns>
		/// <c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
		/// </returns>
		public override bool CanConvert( Type objectType )
		{
			if( objectType.IsGenericType && objectType.GetGenericTypeDefinition() == typeof( NamedMetadataDictionary<> ) )
				return true;

			return false;
		}

		/// <summary>
		/// Reads the JSON representation of the object.
		/// </summary>
		/// <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param><param name="objectType">Type of the object.</param><param name="existingValue">The existing value of object being read.</param><param name="serializer">The calling serializer.</param>
		/// <returns>
		/// The object value.
		/// </returns>
		public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer )
		{
			var target = new NamedMetadataDictionary<TMetadata>();

			JObject source = JObject.Load( reader );
			foreach( JProperty property in source.Properties() )
			{
				var keyValue = (JObject)property.Value;
				var metadata = keyValue.ToObject<TMetadata>( serializer );

				target.Add( property.Name, metadata );
			}

			return target;
		}


		/// <summary>
		/// Writes the JSON representation of the object.
		/// </summary>
		/// <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param><param name="value">The value.</param><param name="serializer">The calling serializer.</param>
		public override void WriteJson( JsonWriter writer, object value, JsonSerializer serializer )
		{
			throw new NotImplementedException();
		}

	}
}